require.config({
    baseUrl: "./modules",
    paths: {
        jq: "../libs/jquery",
        abc: "getGoods",
        renderC: "renderCart",
        getLocal: "getLocal",
        changeL: "changeLocal"
    }
})

require(["jq", "abc", "renderC", "getLocal", "changeL"], (_, gg, rc, gl, cl) => {
    // 1. 请求数据
    const p1 = gg();
    const p2 = gl();

    Promise.all([p1, p2]).then(res => {
        // res是两个请求成功之后的数据，数组的形式，0位是商品数据，1位是本地存储数据
        // 3. 渲染页面
        rc($("tbody"), res);

        // 4-1. 绑定输入框的修改事件 - 修改数量
        $(".setNum").on("input", function () {
            const num = $(this).val() - 0;
            const id = $(this).parent().parent().attr("index");
            // 5-1. 更新数据
            cl(res[1], id, i => {
                // 6-1. 修改数量
                res[1][i].num = num;
            });

            const price = $(this).parent().next().html() - 0;
            $(this).parent().next().next().html(num * price);

            $("#allNum").html(res[1].reduce((prev, now) => prev + (now.check ? now.num : 0), 0));

            $("#allPrice").html(res[1].reduce((prev, now) => prev + (now.check ? now.num * now.price : 0), 0).toFixed(2));

        })

        // 4-2. 绑定删除按钮的点击事件 - 删除商品
        $(".del").on("click", function () {
            const id = $(this).parent().attr("index");
            $(this).parent().remove();
            // 5-2. 更新数据
            cl(res[1], id, i => {
                // 6-2. 删除指定数据
                res[1].splice(i, 1);
            });


            $("#allCheck")[0].checked = res[1].every(val => val.check);


            $("#allNum").html(res[1].reduce((prev, now) => prev + (now.check ? now.num : 0), 0));

            $("#allPrice").html(res[1].reduce((prev, now) => prev + (now.check ? now.num * now.price : 0), 0).toFixed(2));

        })
        // 4-3. 绑定复选框的修改事件 - 选中商品
        $(".check").on("change", function () {
            const id = $(this).parent().parent().attr("index");
            // 使用原生DOM获取复选框的选中状态（jq的DOM没有这个属性）：this.checked
            // 5-3. 更新数据
            cl(res[1], id, i => {
                // 6-3. 修改指定数据的选中状态
                res[1][i].check = Number(this.checked);
            });


            $("#allCheck")[0].checked = res[1].every(val => val.check);

            $("#allNum").html(res[1].reduce((prev, now) => prev + (now.check ? now.num : 0), 0));

            $("#allPrice").html(res[1].reduce((prev, now) => prev + (now.check ? now.num * now.price : 0), 0).toFixed(2));

        })
        // 7. 全选商品 - 全选影响单选
        $("#allCheck").click(function () {
            const aCheck = $(".check");
            // 全选的DOM操作
            for (let i = 0; i < aCheck.length; i++) {
                aCheck[i].checked = this.checked;
            }
            allCheck(res[1], this.checked);


            $("#allNum").html(res[1].reduce((prev, now) => prev + (now.check ? now.num : 0), 0));

            $("#allPrice").html(res[1].reduce((prev, now) => prev + (now.check ? now.num * now.price : 0), 0).toFixed(2));

        })
        // 单选影响全选
        $("#allCheck")[0].checked = res[1].every(val => val.check);

        // =====
        $("#allNum").html(res[1].reduce((prev, now) => prev + (now.check ? now.num : 0), 0));

        // 计算总价
        $("#allPrice").html(res[1].reduce((prev, now) => prev + (now.check ? now.num * now.price : 0), 0).toFixed(2));

        // 删除选中
        $("#delCheck").click(function () {
            let array = [];
            res[1].forEach((val, idx) => {
                if (val.check) {
                    array.push(val.id);
                }
            })
            array.forEach(val => {
                for (let i = 0; i < res[1].length; i++) {
                    if (res[1][i].id === val) {
                        cl(res[1], val, () => {
                            res[1].splice(i, 1);
                            $(`tr[index='${val}']`).remove();
                        })
                    }
                }
            })
        })
    })
})

// 全选影响单选的功能
function allCheck(goods, c) {
    // 全选的数据操作
    goods.forEach(val => {
        val.check = Number(c);
    })
    // 再存回去
    localStorage.setItem("goods", JSON.stringify(goods));
}
